package com.dji.sdk.sample.internal.controller; import android.Manifest; import android.animation.AnimatorInflater; import android.animation.LayoutTransition; import android.animation.ObjectAnimator; import android.app.SearchManager; import android.content.Context; import android.content.pm.ActivityInfo; import android.os.Build; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.ActionBar; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.SearchView; import android.view.Menu; import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.widget.FrameLayout; import android.widget.TextView; import com.dji.sdk.sample.R; import com.dji.sdk.sample.internal.model.ViewWrapper; import com.dji.sdk.sample.internal.utils.ToastUtils; import com.dji.sdk.sample.internal.view.DemoListView; import com.dji.sdk.sample.internal.view.PresentableView; import com.squareup.otto.Subscribe; import dji.common.error.DJIError; import dji.log.DJILog; import dji.sdk.base.BaseProduct; import dji.sdk.sdkmanager.DJISDKManager; import java.util.Stack; public class MainActivity extends AppCompatActivity { private FrameLayout contentFrameLayout; private ObjectAnimator pushInAnimator; private ObjectAnimator pushOutAnimator; private ObjectAnimator popInAnimator; private LayoutTransition popOutTransition; private Stack<ViewWrapper> stack; private TextView titleTextView; private SearchView searchView; private MenuItem searchViewItem; private MenuItem hintItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int permissionCheck = ContextCompat.checkSelfPermission(this, android.Manifest.permission.READ_PHONE_STATE); // When the compile and target version is higher than 22, please request the following permissions at runtime to ensure the SDK work well. if (permissionCheck != 0 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ActivityCompat.requestPermissions(this, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.VIBRATE, Manifest.permission.INTERNET, Manifest.permission.ACCESS_WIFI_STATE, Manifest.permission.WAKE_LOCK, Manifest.permission.ACCESS_COARSE_LOCATION, Manifest.permission.ACCESS_NETWORK_STATE, Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_STATE, Manifest.permission.MOUNT_UNMOUNT_FILESYSTEMS, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.SYSTEM_ALERT_WINDOW, Manifest.permission.READ_PHONE_STATE, }, 1); } DJISampleApplication.getEventBus().register(this); setContentView(R.layout.activity_main); setupActionBar(); contentFrameLayout = (FrameLayout) findViewById(R.id.framelayout_content); initParams(); } @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); DJISDKManager.getInstance().registerApp(this, new DJISDKManager.SDKManagerCallback() { @Override public void onRegister(DJIError djiError) { DJILog.e("App registration", djiError == null ? "null" : djiError.getDescription()); } @Override public void onProductChange(BaseProduct baseProduct, BaseProduct baseProduct1) { // DO nothing. } }); } @Override protected void onDestroy() { DJISampleApplication.getEventBus().unregister(this); super.onDestroy(); } private void setupActionBar() { ActionBar actionBar = getSupportActionBar(); if (null != actionBar) { actionBar.setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); actionBar.setCustomView(R.layout.actionbar_custom); titleTextView = (TextView) (actionBar.getCustomView().findViewById(R.id.title_tv)); } } private void setupInAnimations() { pushInAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.slide_in_right); pushOutAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.fade_out); popInAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.fade_in); ObjectAnimator popOutAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.slide_out_right); pushOutAnimator.setStartDelay(100); popOutTransition = new LayoutTransition(); popOutTransition.setAnimator(LayoutTransition.DISAPPEARING, popOutAnimator); popOutTransition.setDuration(popOutAnimator.getDuration()); } private void initParams() { setupInAnimations(); stack = new Stack<ViewWrapper>(); View view = contentFrameLayout.getChildAt(0); stack.push(new ViewWrapper(view, R.string.activity_component_list)); } private void pushView(ViewWrapper wrapper) { if (stack.size() <= 0) return; contentFrameLayout.setLayoutTransition(null); View showView = wrapper.getView(); View preView = stack.peek().getView(); stack.push(wrapper); contentFrameLayout.addView(showView); pushOutAnimator.setTarget(preView); pushOutAnimator.start(); pushInAnimator.setTarget(showView); pushInAnimator.setFloatValues(contentFrameLayout.getWidth(), 0); pushInAnimator.start(); refreshTitle(); refreshOptionsMenu(); } private void refreshTitle() { if (stack.size() > 1) { ViewWrapper wrapper = stack.peek(); titleTextView.setText(wrapper.getTitleId()); } else if (stack.size() == 1) { BaseProduct product = DJISampleApplication.getProductInstance(); if (product != null && product.getModel() != null) { titleTextView.setText("" + product.getModel().getDisplayName()); } else { titleTextView.setText(R.string.app_name); } } } private void popView() { if (stack.size() <= 1) { finish(); return; } ViewWrapper removeWrapper = stack.pop(); View showView = stack.peek().getView(); View removeView = removeWrapper.getView(); contentFrameLayout.setLayoutTransition(popOutTransition); contentFrameLayout.removeView(removeView); popInAnimator.setTarget(showView); popInAnimator.start(); refreshTitle(); refreshOptionsMenu(); } private void refreshOptionsMenu() { if (stack.size() == 2 && stack.peek().getView() instanceof DemoListView) { searchViewItem.setVisible(true); } else { searchViewItem.setVisible(false); searchViewItem.collapseActionView(); } if (stack.size() == 3 && stack.peek().getView() instanceof PresentableView) { hintItem.setVisible(true); } else { hintItem.setVisible(false); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the options menu from XML MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.menu, menu); // Get the SearchView and set the searchable configuration SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); searchViewItem = menu.findItem(R.id.action_search); hintItem = menu.findItem(R.id.action_hint); searchView = (SearchView) searchViewItem.getActionView(); // Assumes current activity is the searchable activity searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default searchView.setOnCloseListener(new SearchView.OnCloseListener() { @Override public boolean onClose() { DJISampleApplication.getEventBus().post(new SearchQueryEvent("")); return false; } }); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { DJISampleApplication.getEventBus().post(new SearchQueryEvent(query)); return false; } @Override public boolean onQueryTextChange(String newText) { DJISampleApplication.getEventBus().post(new SearchQueryEvent(newText)); return false; } }); // Hint click hintItem.setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { showHint(); return false; } }); return true; } private void showHint() { if (stack.size() != 0 && stack.peek().getView() instanceof PresentableView) { ToastUtils.setResultToToast(((PresentableView) stack.peek().getView()).getHint()); } } @Override public void onBackPressed() { if (stack.size() > 1) { popView(); } else { super.onBackPressed(); } } public static class SearchQueryEvent { private final String query; public SearchQueryEvent(String query) { this.query = query; } public String getQuery() { return query; } } public static class RequestStartFullScreenEvent { } public static class RequestEndFullScreenEvent { } @Subscribe public void onReceiveStartFullScreenRequest(RequestStartFullScreenEvent event) { getSupportActionBar().hide(); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } @Subscribe public void onReceiveEndFullScreenRequest(RequestEndFullScreenEvent event) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); getSupportActionBar().show(); } @Subscribe public void onPushView(final ViewWrapper wrapper) { runOnUiThread(new Runnable() { @Override public void run() { pushView(wrapper); } }); } @Subscribe public void onConnectivityChange(DJISampleApplication.ConnectivityChangeEvent event) { runOnUiThread(new Runnable() { @Override public void run() { refreshTitle(); } }); } }